package com.divemotor.ventarepuestosinternet.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;

import com.divemotor.ventarepuestosinternet.exception.DivemotorBusinessException;

public final class FileUtil {
	
	private static final Logger logger = Logger.getLogger(FileUtil.class);
	
	public static final String NOMBRE_TEMPORAL = "temp";
	public static final String PADDING_NUMBER  = "0";
	public static final String[] EXT 		   = {".jpg",".pdf"};

	private FileUtil(){
		
	}
	
	public static String obtenerNombreTemporal(String ruta){
		File archivo;
		String nombreAleatorio = null;
		do {
			nombreAleatorio = construirNombre(NOMBRE_TEMPORAL, 3, PADDING_NUMBER, EXT[0]);
			archivo = new File(ruta, nombreAleatorio);
		} while (archivo.exists());
		
		return nombreAleatorio;
	}
	
	private static String construirNombre(String prefix, int size, String padding, String ext){
		StringBuilder sb = new StringBuilder();
		sb.append(prefix).
		   append(StringUtils.leftPad(Constantes.EMPTY + (int)(Math.random() * 998 + 1), size, padding)).
		   append(ext);
		
		return sb.toString();
	}
	
	public static boolean renombrarImagen(String ruta, String nombreArchivoImagenActual, String nombreArchivoImagenNuevo) throws DivemotorBusinessException{
		File archivoActual = new File(ruta, nombreArchivoImagenActual);
		File archivoFinal  = new File(ruta, nombreArchivoImagenNuevo);
		
		boolean resultado = archivoActual.renameTo(archivoFinal);
		
		if(!resultado){
			throw new DivemotorBusinessException("No se pudo renombrar el archivo");
		}
		
		return resultado;
	}
	
	public static void eliminarImagen(String ruta, String nombre) {
		File archivo = new File(ruta, nombre);
		
		if (archivo.exists()) {
			archivo.delete();
		}
	}
	
	public static String retornarPath(String ruta, String nombre){
		return ruta + File.separator + nombre;
	}
	
	public static void guardarImagenTemporal(InputStream archivo, String ruta, String nombre) {
		
		File eliminarArchivo = new File(ruta, nombre);
		
		if (eliminarArchivo.exists()) {
			eliminarArchivo.delete();
		}
		
		File file = new File(ruta, nombre);
		OutputStream archivoFinal = null;
		
		try {
			archivoFinal = new FileOutputStream(file);
	
			int read = 0;
			byte[] bytes = new byte[1024];
	
			while ((read = archivo.read(bytes)) != -1) {
				archivoFinal.write(bytes, 0, read);
			}
	
			archivo.close();
			archivoFinal.flush();
			archivoFinal.close();
			
		} catch (Exception e) {
			logger.error("EX* guardarImagenTemporal Exception: " + e.getMessage());
			
			try {
				archivo.close();
				archivoFinal.close();
			} catch (IOException e1) {
				logger.error("EX* guardarImagenTemporal IOException: " + e.getMessage());
			}
			
		}
	}
}
